package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.BitacoraPuestoDAO;
import mx.ipn.persistencia.dao.TipoEmpleadoDAO;
import mx.ipn.to.BitacoraPuestoTO;
import mx.ipn.to.TipoEmpleadoTO;
import mx.ipn.to.FechaHoraTO;

public class BitacoraPuestoDAOMySQL implements BitacoraPuestoDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(BitacoraPuestoDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO bitacora_puesto(id_puesto,nombre,descripcion,id_tipo_empleado,activo,fecha) VALUES(?,?,?,?,?,?)";
	private static final String FINDBYID = "SELECT * FROM bitacora_puesto WHERE id_operacion=?";
	private static final String SELECTBYNOMBRETIPOEMPLEADO = "SELECT * FROM bitacora_puesto WHERE nombre=? and id_tipo_empleado=?";
	private static final String SELECT = "SELECT * FROM bitacora_puesto";
	private static final String SELECTBYRANGOFECHA = "SELECT * FROM bitacora_puesto WHERE fecha>=? AND fecha<=?";
	private static final String SELECTBYPUESTO = "SELECT * FROM bitacora_puesto WHERE id_puesto=?";

	@Override
	public BitacoraPuestoTO findBitacoraPuestoById(int idOperacion) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setInt(1, idOperacion);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {

				
				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
				
				TipoEmpleadoDAO tipoEmpleadoDAO = fabricaMySQL
						.getTipoEmpleadoDAO();

				BitacoraPuestoTO puestoTO = new BitacoraPuestoTO(idOperacion,
						rs.getShort("id_puesto"), rs.getString("nombre"), rs
								.getString("descripcion"), tipoEmpleadoDAO
								.findTipoEmpleadoById(rs
										.getShort("id_tipo_empleado")), rs
								.getBoolean("activo"), rs.getDate("fecha"));

				ps.close();
				conexion.close();
				return puestoTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public boolean insertBitacoraPuesto(BitacoraPuestoTO bitacoraPuestoTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setShort(1, bitacoraPuestoTO.getIdPuesto());
			ps.setString(2, bitacoraPuestoTO.getNombre());
			ps.setString(3, bitacoraPuestoTO.getDescripcion());
			ps.setShort(4, bitacoraPuestoTO.getTipoEmpleadoTO()
					.getIdTipoEmpleado());
			ps.setBoolean(5, bitacoraPuestoTO.getActivo());
			ps.setDate(6, FechaHoraTO.getFecha(bitacoraPuestoTO.getFecha()));
			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public ArrayList<BitacoraPuestoTO> selectBitacoraPuesto() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;
			
			TipoEmpleadoDAO tipoEmpleadoDAO = null;

			ArrayList<BitacoraPuestoTO> bitacoraPuestoTO = null;
			BitacoraPuestoTO bitacoraPuestoTO2 = null;

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (bitacoraPuestoTO == null) {
					bitacoraPuestoTO = new ArrayList<BitacoraPuestoTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					tipoEmpleadoDAO = fabricaMySQL.getTipoEmpleadoDAO();
				}

				bitacoraPuestoTO2 = new BitacoraPuestoTO(rs
						.getInt("id_operacion"), rs.getShort("id_puesto"), rs
						.getString("nombre"), rs.getString("descripcion"),
						tipoEmpleadoDAO.findTipoEmpleadoById(rs
								.getShort("id_tipo_empleado")), rs
								.getBoolean("activo"), rs.getDate("fecha"));

				bitacoraPuestoTO.add(bitacoraPuestoTO2);
			}
			ps.close();
			conexion.close();
			return bitacoraPuestoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<BitacoraPuestoTO> selectBitacoraPuestoByRangoFecha(Date inicioFecha,Date finFecha) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;
			
			TipoEmpleadoDAO tipoEmpleadoDAO = null;

			ArrayList<BitacoraPuestoTO> bitacoraPuestoTO = null;
			BitacoraPuestoTO bitacoraPuestoTO2 = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYRANGOFECHA);
			ps.setDate(1, inicioFecha);
			ps.setDate(2, finFecha);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (bitacoraPuestoTO == null) {
					bitacoraPuestoTO = new ArrayList<BitacoraPuestoTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					tipoEmpleadoDAO = fabricaMySQL.getTipoEmpleadoDAO();
				}

				bitacoraPuestoTO2 = new BitacoraPuestoTO(rs
						.getInt("id_operacion"), rs.getShort("id_puesto"), rs
						.getString("nombre"), rs.getString("descripcion"),
						tipoEmpleadoDAO.findTipoEmpleadoById(rs
								.getShort("id_tipo_empleado")), rs
								.getBoolean("activo"), rs.getDate("fecha"));

				bitacoraPuestoTO.add(bitacoraPuestoTO2);
			}
			ps.close();
			conexion.close();
			return bitacoraPuestoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<BitacoraPuestoTO> selectBitacoraPuestoByIdPuesto(
			short idPuesto) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
		
			FabricaDeDAOs fabricaMySQL = null;

			TipoEmpleadoDAO tipoEmpleadoDAO = null;

			ArrayList<BitacoraPuestoTO> bitacoraPuestoTO = null;
			BitacoraPuestoTO bitacoraPuestoTO2 = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYPUESTO);
			ps.setShort(1, idPuesto);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (bitacoraPuestoTO == null) {
					bitacoraPuestoTO = new ArrayList<BitacoraPuestoTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					tipoEmpleadoDAO = fabricaMySQL.getTipoEmpleadoDAO();
				}

				bitacoraPuestoTO2 = new BitacoraPuestoTO(rs
						.getInt("id_operacion"), rs.getShort("id_puesto"), rs
						.getString("nombre"), rs.getString("descripcion"),
						tipoEmpleadoDAO.findTipoEmpleadoById(rs
								.getShort("id_tipo_empleado")), rs
								.getBoolean("activo"), rs.getDate("fecha"));

				bitacoraPuestoTO.add(bitacoraPuestoTO2);
			}
			ps.close();
			conexion.close();
			return bitacoraPuestoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public BitacoraPuestoTO selectBitacoraPuestoByNombreTipoEmpleado(
			String nombre, short idTipoEmpleado) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;
			
			TipoEmpleadoDAO tipoEmpleadoDAO = null;

			ArrayList<Integer> listIdOperacion = null;
			ArrayList<Short> listIdPuesto = null;
			ArrayList<String> listNombre = null;
			ArrayList<String> listDescripcion = null;
			ArrayList<Boolean> listActivo = null;
			ArrayList<java.sql.Date> listFecha = null;

			BitacoraPuestoTO bitacoraPuestoTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYNOMBRETIPOEMPLEADO);
			ps.setString(1, nombre);
			ps.setShort(2, idTipoEmpleado);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdOperacion == null) {

					listIdOperacion = new ArrayList<Integer>();
					listIdPuesto = new ArrayList<Short>();
					listNombre = new ArrayList<String>();
					listDescripcion = new ArrayList<String>();
					listActivo = new ArrayList<Boolean>();
					listFecha = new ArrayList<java.sql.Date>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					tipoEmpleadoDAO = fabricaMySQL.getTipoEmpleadoDAO();
				}

				listIdOperacion.add(rs.getInt("id_operacion"));
				listIdPuesto.add(rs.getShort("id_puesto"));
				listNombre.add(rs.getString("nombre"));
				listDescripcion.add(rs.getString("descripcion"));
				listActivo.add(rs.getBoolean("activo"));
			}
			if (listIdPuesto != null) {
				TipoEmpleadoTO tipoEmpleadoTO = tipoEmpleadoDAO.findTipoEmpleadoById(idTipoEmpleado);
				
				Integer[] arrIdOperacion = (Integer[])listIdOperacion.toArray(new Integer[listIdOperacion.size()]);
				Short[] arrIdPuesto = (Short[])listIdPuesto.toArray(new Short[listIdPuesto.size()]);
				Boolean[] arrActivo = (Boolean[])listActivo.toArray(new Boolean[listActivo.size()]);
				Date[] arrFecha = (Date[])listFecha.toArray(new Date[listFecha.size()]);
				String[] arrDescripcion = (String[])listDescripcion.toArray(new String[listDescripcion.size()]);
				String[] arrNombre = (String[])listNombre.toArray(new String[listNombre.size()]);
				
				bitacoraPuestoTO = new BitacoraPuestoTO(arrIdOperacion,
						arrIdPuesto, arrNombre, arrDescripcion,tipoEmpleadoTO,
						arrActivo, arrFecha);
			}
			ps.close();
			conexion.close();
			return bitacoraPuestoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
}
